package main

import (
	"fmt"
	"reflect"
	"unsafe"
)

func main() {
	// demo1()
	demo2()
}

func StringToByte(key *string) []byte {
	strPtr := (*reflect.SliceHeader)(unsafe.Pointer(key)) // 这里直接操作的是内存片，转化完成后，就可以通过slice的系列方法操作地址代表的值
	strPtr.Cap = strPtr.Len
	b := *(*[]byte)(unsafe.Pointer(strPtr))
	return b
}

func demo1() {
	decryptContent := "/AvYEjm4g6xJ3LVrk2/Adk"
	iv := decryptContent[0:16]
	key := decryptContent[2:18]
	fmt.Println(&iv)
	fmt.Println(&key)
	ivBytes := StringToByte(&iv)
	keyBytes := StringToByte(&key)
	fmt.Println(string(ivBytes))
	fmt.Println(string(keyBytes)) // panic
}

// 因为StringToByte函数中强制地址类型转换，导致了iv多踩8byte内存，将key的str字段内容更改，
// 所以调用Println的时候报了空地址错误

/* 更改 */

func StringToByte2(key *string) []byte {
	// 获取string类型的胖指针在Slice视角下的值内容
	strPtr := (*reflect.SliceHeader)(unsafe.Pointer(key))
	// 构造新Slice指针对象
	res := reflect.SliceHeader{
		Data: strPtr.Data,
		Len:  strPtr.Len,
		Cap:  strPtr.Len,
	}
	b := *(*[]byte)(unsafe.Pointer(&res))
	return b
}

func demo2() {
	decryptContent := "/AvYEjm4g6xJ3LVrk2/Adk"
	iv := decryptContent[0:16]
	key := decryptContent[2:18]
	fmt.Println(&iv)
	fmt.Println(&key)
	ivBytes := StringToByte2(&iv)
	keyBytes := StringToByte2(&key)
	fmt.Println(string(ivBytes))
	fmt.Println(string(keyBytes)) // panic
}
